Los detalles sobre este paquete se encuentran en la Sección 6.17.2 , "Contenido de GCC ".
El paquete GCC contiene la colección de compiladores GNU, que incluye los compiladores C y C++ .
Nuestra primera compilación de GCC ha instalado un par de encabezados internos del sistema . Normalmente uno de ellos, limits.h será el que a su vez incluya la cabecera limits.h del sistema correspondiente , en este caso , /tools/include/limits.h . Sin embargo , en el momento de la primera compilación de gcc /tools/include/limits.h no existía , por lo que la cabecera interna que GCC ha instalado es un archivo parcial , autónomo y no incluye las funciones ampliadas de la cabecera del sistema . Esto fue suficiente para la construcción de la libc temporal, pero esta construcción de GCC ahora requiere la cabecera interna completa . Creamos una versión completa de la cabecera interna utilizando un comando que es idéntico a lo que hace el sistema de compilación de GCC en circunstancias normales:
cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \ `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h
Para las máquinas x86 , una construcción de arranque de GCC utiliza el fomit-frame-pointer compiler flag . Construcciones non-bootstrap omiten dicha opción , y el objetivo debe ser producir un compilador que es exactamente el mismo que si se tratara de bootstrap . Aplica el siguiente comando sed para forzar la construcción que use el flag:
case `uname -m` in i?86) sed -i 's/^T_CFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in ;; esac
Una vez más, cambia la localización del enlazador dinámico de GCC para usar la instalada en /tools.
for file in \ $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h) do cp -uv $file{,.orig} sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \ -e 's@/usr@/tools@g' $file.orig > $file echo ' #undef STANDARD_STARTFILE_PREFIX_1 #undef STANDARD_STARTFILE_PREFIX_2 #define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/" #define STANDARD_STARTFILE_PREFIX_2 ""' >> $file touch $file.orig done
Al igual que en la primera versión de GCC, se requieren los paquetes GMP, MPFR y MPC . Descomprime los archivos de código y los traslada a los nombres de los directorios necesarios:
tar -Jxf ../mpfr-3.1.2.tar.xz mv -v mpfr-3.1.2 mpfr tar -Jxf ../gmp-5.1.3.tar.xz mv -v gmp-5.1.3 gmp tar -zxf ../mpc-1.0.2.tar.gz mv -v mpc-1.0.2 mpc
Cree un directorio de construcción dedicado:
mkdir -v ../gcc-build cd ../gcc-build
Antes de iniciar la construcción de GCC , recuerda desactivar cualquier variable de entorno que modifique las opciones de optimización por defecto.
Ahora, prepara GCC para su compilación:
CC=$LFS_TGT-gcc \ CXX=$LFS_TGT-g++ \ AR=$LFS_TGT-ar \ RANLIB=$LFS_TGT-ranlib \ ../gcc-4.8.2/configure \ --prefix=/tools \ --with-local-prefix=/tools \ --with-native-system-header-dir=/tools/include \ --enable-clocale=gnu \ --enable-shared \ --enable-threads=posix \ --enable-__cxa_atexit \ --enable-languages=c,c++ \ --disable-libstdcxx-pch \ --disable-multilib \ --disable-bootstrap \ --disable-libgomp \ --with-mpfr-include=$(pwd)/../gcc-4.8.2/mpfr/src \ --with-mpfr-lib=$(pwd)/mpfr/src/.libs
El significado de las nuevas opciones de configure:
--enable-clocale=gnu
Esta opción asegura que el modelo de locales correcto está seleccionado para las bibliotecas de C++ en todas las circunstancias . Si el script configure encuentra instalada la locale de_DE , seleccionará el modelo correcto de gnu . Sin embargo , si la configuración regional de_DE no está instalada, se corre el riesgo de construir interfaz binaria de aplicación (ABI ) incompatibles con bibliotecas de C++ debido a que el modelo de locales genérico incorrecto puede ser seleccionado.
--enable-threads=posix
Esto permite la manipulación C++ para el código de excepción multi-hilo
--enable-__cxa_atexit
Esta opción permite el uso de __ cxa_atexit , en lugar de atexit , para registrar destructores C++ para objetos estáticos locales y objetos globales . Esta opción es esencial para un manejo totalmente compatible con los estándares de los destructores . También afecta a la C++ ABI , y por lo tanto da lugar a bibliotecas C++ compartidas y programas C++ interoperables con otras distribuciones Linux .
--enable-languages=c,c++
Esta opción garantiza que tanto el C y C++ compiladores puedan ser construidos.
--disable-libstdcxx-pch
No construye la cabecera precompilada ( PCH ) para libstdc++ . Se necesita una gran cantidad de espacio, y no tenemos ningún uso para él .
--disable-bootstrap
Para construcciones nativas de GCC , lo predeterminado es hacer un build "bootstrap " . Esto no sólo compila GCC , sino que lo compila varias veces. Usa los programas compilados la primera vez para compilarse a sí mismo una segunda vez , y luego otra vez por tercera vez. La segunda y tercera iteraciones son comparados para asegurarse que puede reproducirse a sí mismo sin errores . Esto también implica que se ha compilado correctamente . Sin embargo , el método de construcción de LFS debe proporcionar un compilador sólido, sin la necesidad de arrancar cada vez .
Compila the paquete:
make
Instala el paquete:
make install
Como toque final, crea un enlace simbólico . Muchos programas y scripts ejecutan cc en vez de gcc, que se utiliza para los programas que sean genéricos y por tanto utilizables en toda clase de sistemas UNIX donde no siempre se instala el compilador de C de GNU . Ejecutar cc deja al administrador del sistema libre de decidir qué compilador de C instalar:
ln -sv gcc /tools/bin/cc
En este punto , es obligatorio parar y asegurarse de que las operaciones básicas (compilación y enlazado) de las nuevas herramientas funcionan como se esperaba. Para llevar a cabo una comprobación de validez , ejecute los siguientes comandos :
echo 'main(){}' > dummy.c cc dummy.c readelf -l a.out | grep ': /tools'
Si todo funciona correctamente, no debe haber errores y la salida del último comando debe ser de la forma:
[Requesting program interpreter: /tools/lib/ld-linux.so.2]
Tenga en cuenta que /tools/lib
, o
/tools/lib64
para equipos de 64 bits aparece como el prefijo de tu enlazador dinámico.
Si la salida no se muestra como arriba, o no hay salida alguna , algo está mal. Investiga y sigue los pasos para averiguar dónde está el problema y corregirlo. Este problema se debe resolver antes de continuar . En primer lugar, realiza la comprobación de sanidad usando gcc en vez de cc . Si esto funciona, entonces el enlace simbólico /tools/bin/cc no se encuentra. Instala el enlace simbólico a lo anterior . A continuación, asegúrate de que la ruta es correcta . Esto se puede comprobar ejecutando echo $PATH y verificando que /tools/bin está en cabeza de la lista. Si el PATH está mal puede significar que no estás en el sistema como usuario lfs o que algo salió mal en la Sección 4.4, " Configuración del entorno ".
Una vez que todo esté bien, borra los ficheros de prueba :
rm -v dummy.c a.out
Los detalles sobre este paquete se encuentran en la Sección 6.17.2 , "Contenido de GCC ".